package 晚间作业0309;

import java.util.Arrays;

public class Doc06 {
    protected String d;

    public static void main(String[] args) {
        System.out.println(findSecondaryMaximumNumber(new int[] {6, 6, 6 ,5}));
        System.out.println(Arrays.toString(reverseArray(new int[] {1, 2, 3, 4})));
        System.out.println(sumCalculate(new int[] {1}, 0));
        System.out.println(avgCalculate(new int[] {9, 9, 9, 9, 9, 9, 8, 8, 9, 9}));
    }

    /**
     * 3. （难）设计一个方法，找出一个整型数组中的第二大的值。
     * 1. 不可以通过排序实现，不能修改数组中的数据顺序
     * 2. 要考虑到最大的数字可能出现多次
     */
    public static int findSecondaryMaximumNumber(int[] arr) {
        if (arr == null || arr.length < 2) { return -1; }
        int max = -1, secMax = -1;
        //找到最大值
        for (int j : arr) {
            if (j > max) {
                max = j;
            }
        }
        for (int j : arr) {
            if (j < max && j > secMax) {
                secMax = j;
            }
        }
        return secMax;
    }

    /**
     * 4. （中）设计一个方法，将一个数组中的元素倒序排列（注意，不是降序）。
     */
    public static int[] reverseArray(int[] arr) {
        if (arr == null || arr.length < 2) { return arr; }
        int start = 0, end = arr.length - 1;
        while (start < end) {
            arr[start] = arr[start] + arr[end] - (arr[end] = arr[start]);
            start++;
            end--;
        }
        return arr;
    }

    /**
     * 7. （中）使用递归计算一个数组中的元素和。
     */
    public static int sumCalculate(int[] arr, int start) {
        if (arr == null || arr.length == 0) { return 0; }
        else if (start == arr.length - 1) { return arr[start]; }
        return arr[start] + sumCalculate(arr, start + 1);
    }

    /**
     * 8.（易）小明参加歌手比赛，评委组给出10个成绩，去掉一个最高分，去掉一个最低分，求平均分
     */
    public static double avgCalculate(int[] arr) {
        if (arr == null || arr.length == 0) { return 0.0; }
        int maxIdx = 0, minIdx = 0;
        int len = arr.length;
        for (int i = 0; i < len; i++) {
            if (arr[i] > arr[maxIdx]) {
                maxIdx = i;
            }
            if (arr[i] <= arr[minIdx]) {
                minIdx = i;
            }
        }
        double result = 0.0;
        for (int i = 0; i < len; i++) {
            if (i == maxIdx || i == minIdx) {
                continue;
            }
            result += arr[i];
        }
        return result / (len - 2);
    }
}
